// 任务的文件
#include <iostream>
#include <vector>
#include <unistd.h>
#include <time.h>
#include <functional>
// 描述任务 , 可以用函数指针指向不同的任务
// typedef void(*task_t)();  // 函数指针

// 用C++11 的包装器代替函数指针
using Task = std::function<void()>;  // using 可以重命名
 
/// ***********  任务的描述 ***********

// 上传
void UpLoad()
{
    std::cout << "这是一个上传的任务 !" << std::endl;
    std::cout << "上传中 ..... > 上传速度 : 10Mb/s " << std::endl;
    std::cout << "上传成功 !" << std::endl;
    std::cout << "###################################" << std::endl;
}

// 下载
void DownLoad()
{
    std::cout << "这是一个下载的任务 !" << std::endl;
    std::cout << "下载中 ..... > 下载速度 : 50Mb/s " << std::endl;
    std::cout << "下载成功 !" << std::endl;
    std::cout << "###################################" << std::endl;
}

// 用户注册任务
void UserRegistration()
{
    std::cout << "这是一个用户注册的任务 !" << std::endl;
    std::cout << "注册成功 !" << std::endl;
    std::cout << "###################################" << std::endl;
}

/// ***********  任务的管理 ***********

class TaskManage
{
private:
    TaskManage()
    {
        srand(time(nullptr));
    }
    //使用默认析构
    ~TaskManage() = default; 

    //生成随机码 , 随机码为任务列表中的下标
    int Code()
    {
        //随机码为数组下标 , 每一个代表的是一个任务
        int code = rand() % _tasks.size();
        return code;
    }

    //往任务管理列表找那个插入任务
    void Regist(Task task)
    {
        _tasks.emplace_back(task);
    }

    //执行任务
    void Excute(int code)
    {
        if(code >=0 && code <= _tasks.size())
        {
            _tasks[code](); // 包装器的调用 , 调用里面的函数指针
        }
    }
private:
    std::vector<Task> _tasks; // 管理任务的数据结构
    friend class ProcessPool ; // 友元
};